home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Games: Greatest Hits 1996
/
Amiga Games: Greatest Hits 1996.iso
/
archive
/
userbox
/
publicdomain
/
engclock_v7.0.lha
/
EngClock_v7.0
/
EngClock7_Source
/
special.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-19
|
14KB
|
615 lines
/* Special "access" routines */
#include <clib/exec_protos.h>
#include <clib/wb_protos.h>
#include <clib/alib_protos.h>
#include <clib/commodities_protos.h>
#include <clib/intuition_protos.h>
#include <clib/dos_protos.h>
#include <libraries/commodities.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <intuition/intuition.h>
#include <clib/intuition_protos.h>
#include <exec/exec.h>
#include <intuition/screens.h>
#include <rexx/storage.h>
#include <clib/rexxsyslib_protos.h>
#include <libraries/arq.h>
#include <clib/icon_protos.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>
/* #define DEBUG_CODE */
#define ENGLISH 1
#define FRENCH 2
#define SPANISH 3
struct Message *a_msg=NULL;
struct MsgPort *CxMsgPort=NULL, *CxHotKey1=NULL, *CxHotKey2=NULL, *RexxPort=NULL;
CxObj *CommObj, *hk1, *hk2;
CxMsg *CxMessage;
struct Library *IconBase=NULL;
extern struct Window *win_p;
extern BOOL talk(char *text);
extern char line2[200];
extern char line1[200];
extern struct Menu menu1;
extern BOOL loadpic(char *fname, struct Screen *screen);
extern void refreshwindow(void);
extern char *trans(char *text);
extern BOOL ispicture;
extern int language;
extern int prefsgui(void);
extern void changemenu(void);
extern BOOL exit_flag;
extern void msg(char *msg);
extern struct NewWindow win1;
extern void closeall(void);
extern void setupmainwindow(void);
extern struct Screen *pubscreen;
extern struct Library *CxBase;
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct Library *UtilityBase;
extern struct Library *GadToolsBase;
extern struct Library *DiskfontBase;
extern struct Library *AslBase;
extern struct Library *IFFParseBase;
extern struct Library *DOSBase;
extern struct Library *RexxSysBase;
BOOL cxinit(void);
BOOL arexxinit(void);
void cxclose(void);
void arexxclose(void);
void process_arexx(void);
void process_args(int count, char *args[]);
void process_wbargs(struct WBStartup *wbs);
struct Event {
BOOL used;
int type; /* Type of event */
int hours; /* Time of event */
int minutes;
int timecode;
char message[256];
int day;
int month;
int year;
BOOL enabledate;
int freq;
};
extern struct {
/* Prefs structure used for preferences file format */
char header[10]; /* I.D. Header */
int vers; /* Version of preferences file */
int x; /* X dimension of window when saved */
int y; /* Y dimension of window when saved */
int width; /* Width of window when saved */
int height; /* Height of window when saved */
int planguage; /* Language selected (menu) when saved, low pri */
int just; /* Justification of text, 0=Left, 1=Centre, 2=Right */
short date; /* Display date?, 0 = No, 1=Yes */
short wtf; /* Window to front ? */
int time_col[8];
int date_col[8];
short autoadjust; /* Use automatic adjustment on window ? */
char backdrop[256]; /* Backdrop image */
char pub[139]; /* Default public screen */
char accent[256]; /* Language file for tRanslate */
char tkey[100];
char hkey[100];
struct Event events[11]; /* For the alarm! */
}prefs;
static struct NewBroker newbrok = {
NB_VERSION,
"EngClock 1",
"EngClock v6.6 © 1995 by Ben Matthew",
"A clock with words!",
NBU_UNIQUE|NBU_NOTIFY,
COF_SHOW_HIDE,
0,
0,
0
};
BOOL cxinit(void) {
char comtext[50], tmp[10];
int count=1;
#define MAXBROKERS 10
if(!CxBase)
return(0);
CxMsgPort=CreateMsgPort();
CxHotKey1=CreateMsgPort();
CxHotKey2=CreateMsgPort();
if(!(CxMsgPort && CxHotKey1 && CxHotKey2))
return(0);
newbrok.nb_Port=CxMsgPort;
while(!(CommObj=CxBroker(&newbrok,NULL))) {
count++;
if(count==MAXBROKERS) break;
strcpy(comtext,"EngClock ");
sprintf(tmp,"%d",count);
strcat(comtext,tmp);
newbrok.nb_Name=comtext;
}
if(!CommObj) {
DeleteMsgPort(CxMsgPort);
CxMsgPort=NULL;
return(0);
} else
ActivateCxObj(CommObj,1L);
hk1=HotKey(prefs.tkey,CxHotKey1,1234);
hk2=HotKey(prefs.hkey, CxHotKey2,9999);
if(!(hk1 && hk2)) {
if(hk1) DeleteCxObj(hk1);
if(hk2) DeleteCxObj(hk2);
DeleteMsgPort(CxHotKey1);
} else {
AttachCxObj(CommObj,hk1);
AttachCxObj(CommObj,hk2);
ActivateCxObj(CommObj,1L);
}
return(1);
}
void cxclose(void) {
if(CommObj)
DeleteCxObjAll(CommObj);
if(CxMsgPort) {
while(CxMessage=(CxMsg *)GetMsg(CxMsgPort))
ReplyMsg((struct Message *)CxMessage);
DeleteMsgPort(CxMsgPort);
CxMsgPort=NULL;
}
if(CxHotKey1) {
while(CxMessage=(CxMsg *)GetMsg(CxHotKey1))
ReplyMsg((struct Message *)CxMessage);
DeleteMsgPort(CxHotKey1);
CxHotKey1=NULL;
}
if(CxHotKey2) {
while(CxMessage=(CxMsg *)GetMsg(CxHotKey2))
ReplyMsg((struct Message *)CxMessage);
DeleteMsgPort(CxHotKey2);
CxHotKey2=NULL;
}
return;
}
/* Now a simple routine that is used in main() to check what the user
wants to do about a menu selection */
BOOL wb_ask(char *body, char *opt1, char *opt2) {
struct ExtEasyStruct deadeasy;
char string[500];
char params[100];
strcpy(string,"English Clock v6.9\n\n");
strcat(string,body);
strcpy(params,opt2);
strcat(params,"|");
strcat(params,opt1);
deadeasy.Magic=ARQ_MAGIC;
deadeasy.AnimID=ARQ_ID_QUESTION;
deadeasy.Easy.es_Title=" ";
deadeasy.Easy.es_TextFormat=string;
deadeasy.Easy.es_GadgetFormat=params;
return(EasyRequest(NULL,&deadeasy.Easy,NULL,NULL));
}
BOOL arexxinit(void) {
Forbid();
if(FindPort("ENG_REXX")) {
Permit();
return(0);
}
if(!(RexxPort=(struct MsgPort *)CreatePort("ENG_REXX",0))) {
Permit();
return(0);
}
Permit();
// Best to set up RexxBase as well
if(!(RexxSysBase=OpenLibrary("rexxsyslib.library",0))) {
DeletePort(RexxPort);
return(0);
}
// And thats it!
return(1);
}
void arexxclose(void) {
struct Message *a_mess=NULL;
while(a_mess=GetMsg(RexxPort))
ReplyMsg(a_mess);
Forbid();
DeletePort(RexxPort);
Permit();
RexxPort=NULL;
if(RexxSysBase) CloseLibrary(RexxSysBase);
RexxSysBase=NULL;
}
void process_arexx(void) {
struct RexxMsg *rexxmsg=NULL;
char string[50];
char newspeak[200];
char *ptr, *ptr2;
char string2[50];
BPTR file;
int x, y, width, height, count=7, gotted=0, len;
while(rexxmsg=(struct RexxMsg *)GetMsg(RexxPort)) {
// We have a message, but what is it!
ptr=CreateArgstring(rexxmsg->rm_Args[0],strlen(rexxmsg->rm_Args[0]));
sprintf(string,"%s",ptr);
if(!strcmp(string,"SPEAK")) {
strcpy(newspeak,line1);
if(language==ENGLISH) newspeak[strlen(newspeak)-4]=NULL; /* Get rid of pm/am */
strcat(newspeak,". ");
strcat(newspeak,line2);
newspeak[strlen(newspeak)-6]=NULL; /* Get rid of year */
talk(trans(newspeak));
}
if(!strcmp(string,"PREFS")) {
prefsgui();
ClearMenuStrip(win_p);
changemenu();
SetMenuStrip(win_p,&menu1);
ispicture=loadpic(prefs.backdrop,pubscreen);
refreshwindow();
}
if(!strcmp(string,"ACTIVATE")) {
WindowToFront(win_p);
}
if(!strcmp(string,"QUIT")) {
exit_flag=TRUE;
}
if(!strcmp(string,"LEFT")) {
prefs.just=0;
refreshwindow();
}
if(!strcmp(string,"RIGHT")) {
prefs.just=2;
refreshwindow();
}
if(!strcmp(string,"CENTRE")) {
prefs.just=1;
refreshwindow();
}
if(!strcmp(string,"ENGLISH")) {
language=ENGLISH;
refreshwindow();
ClearMenuStrip(win_p);
changemenu();
SetMenuStrip(win_p,&menu1);
}
if(!strcmp(string,"FRENCH")) {
language=FRENCH;
refreshwindow();
ClearMenuStrip(win_p);
changemenu();
SetMenuStrip(win_p,&menu1);
}
if(!strcmp(string,"SPANISH")) {
language=SPANISH;
refreshwindow();
ClearMenuStrip(win_p);
changemenu();
SetMenuStrip(win_p,&menu1);
}
if(!strcmp(string,"AUTO ON")) {
prefs.autoadjust=1;
refreshwindow();
}
if(!strcmp(string,"AUTO OFF")) {
prefs.autoadjust=0;
refreshwindow();
}
if(!strcmp(string,"DATE ON")) {
prefs.date=1;
refreshwindow();
}
if(!strcmp(string,"DATE OFF")) {
prefs.autoadjust=0;
refreshwindow();
}
strcpy(string2,string);
string2[8]=NULL;
if(!strcmp(string2,"SENDPORT")) {
ptr2=&string2[9];
if(file=Open(ptr2,MODE_OLDFILE)) {
Write(file,line1,strlen(line1));
Close(file);
}
}
if(!strcmp(string2,"SENDFILE")) {
ptr2=&string2[9];
if(file=Open(ptr2,MODE_READWRITE)) {
Write(file,line1,strlen(line1));
Close(file);
}
}
strcpy(string2,string);
string2[6]=NULL;
if(!strcmp(string2,"SCREEN")) {
ptr2=&string2[7];
sprintf(prefs.pub,"%s",ptr2);
}
if(!strcmp(string2,"ACCENT")) {
ptr2=&string2[7];
sprintf(prefs.accent,"%s",ptr2);
}
strcpy(string2,string);
string2[5]=NULL;
if(!strcmp(string2,"PICCY")) {
ptr2=&string2[6];
sprintf(prefs.backdrop,ptr2);
ispicture=loadpic(prefs.backdrop,pubscreen);
refreshwindow();
}
strcpy(string2,string);
string2[6]=NULL;
count=7;
if(!strcmp(string2,"NEWWIN")) {
strcpy(string2,string); /* Re-init string2 */
ptr2=&string2[7];
len=strlen(string2);
while(count <= len) {
if(string[count]==NULL) /* End of line yet? */
height=atoi(ptr2);
if(string2[count]==',') {
string2[count]=NULL;
switch(gotted) {
case 0:
x=atoi(ptr2);
break;
case 1:
y=atoi(ptr2);
break;
case 2:
width=atoi(ptr2);
break;
}
gotted++;
ptr2=&string2[count]+1;
}
count++;
}
if(gotted==3) {
// If not there has been a parse error
prefs.x=x;
prefs.y=y;
prefs.width=width;
prefs.height=height;
ClearMenuStrip(win_p);
CloseWindow(win_p);
setupmainwindow();
if(!(win_p=OpenWindow(&win1))) {
msg("Error re-opening window!");
// Best to reply before bye
ReplyMsg((struct Message *)rexxmsg);
closeall();
exit(NULL);
}
SetMenuStrip(win_p,&menu1);
refreshwindow();
}
}
ReplyMsg((struct Message *)rexxmsg);
}
DeleteArgstring(ptr);
}
void process_args(int count, char *args[]) {
// Quicky to process command line args
int i=0, j=0;
char byte;
char byte_s[2];
char string[200], string2[200];
// is it from wb?
if(count==0)
process_wbargs((struct WBStartup *)args);
// is there any args?
if(count<2)
return;
// Right ok we have some
for (i=1; i<count; i++) {
strcpy(string2,"");
//printf("Testing arg: %d\n",i);
strcpy(string,args[i]);
//printf("which is: %s\n",string);
for(j=0; j<strlen(args[i]); j++) {
byte=string[j];
if(byte != '=') {
sprintf(byte_s,"%c",byte);
strcat(string2,byte_s);
}
else {
//printf("found sign!\n");
//printf("s2 is now: %s\n",string2);
if(!(strcmp(string2,"X"))) {
prefs.x=atoi(&string[j+1]);
//printf("X is %d\n",atoi(&string[j+1]));
}
if(!(strcmp(string2,"Y"))) {
prefs.y=atoi(&string[j+1]);
//printf("Y is %d\n",atoi(&string[j+1]));
}
if(!(strcmp(string2,"WIDTH"))) {
prefs.width=atoi(&string[j+1]);
//printf("WIDTH is %d\n",atoi(&string[j+1]));
}
if(!(strcmp(string2,"HEIGHT"))) {
prefs.height=atoi(&string[j+1]);
//printf("HEIGHT is %d\n",atoi(&string[j+1]));
}
if(!(strcmp(string2,"PUBSCREEN"))) {
strcpy(prefs.pub,&string[j+1]);
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
if(!(strcmp(string2,"JUSTIFICATION"))) {
prefs.just=atoi(&string[j+1]);
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
if(!(strcmp(string2,"DATE"))) {
if(!(strcmp(&string[j+1],"YES")))
prefs.date=1;
else
prefs.date=0;
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
if(!(strcmp(string2,"WTF"))) {
if(!(strcmp(&string[j+1],"YES")))
prefs.wtf=1;
else
prefs.wtf=0;
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
if(!(strcmp(string2,"ADJUST"))) {
if(!(strcmp(&string[j+1],"YES")))
prefs.autoadjust=1;
else
prefs.autoadjust=0;
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
if(!(strcmp(string2,"BACKDROP"))) {
strcpy(prefs.backdrop,&string[j+1]);
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
if(!(strcmp(string2,"ACCENT"))) {
strcpy(prefs.accent,&string[j+1]);
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
if(!(strcmp(string2,"TALKKEY"))) {
strcpy(prefs.tkey,&string[j+1]);
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
if(!(strcmp(string2,"HOTKEY"))) {
strcpy(prefs.hkey,&string[j+1]);
//printf("PUBSCREEN is %s\n",&string[j+1]);
}
}
}
}
}
void process_wbargs(struct WBStartup *wbs) {
struct DiskObject *dobj;
char *result;
if(!(IconBase=OpenLibrary("icon.library",0))) {
msg("Unable to open icon library!");
return;
}
dobj=GetDiskObject(wbs->sm_ArgList->wa_Name);
if(!dobj) {
msg("Unable to get disk object!");
CloseLibrary(IconBase);
return;
}
// Code to find tool tpes here
if(result=FindToolType(dobj->do_ToolTypes,"X"))
prefs.x=atoi(result);
if(result=FindToolType(dobj->do_ToolTypes,"Y"))
prefs.y=atoi(result);
if(result=FindToolType(dobj->do_ToolTypes,"WIDTH"))
prefs.width=atoi(result);
if(result=FindToolType(dobj->do_ToolTypes,"HEIGHT"))
prefs.height=atoi(result);
if(result=FindToolType(dobj->do_ToolTypes,"JUSTIFICATION"))
prefs.just=atoi(result);
if(result=FindToolType(dobj->do_ToolTypes,"DATE")) {
if(!(strcmp(result,"YES")))
prefs.date=1;
else
prefs.date=0;
}
if(result=FindToolType(dobj->do_ToolTypes,"WTF")) {
if(!(strcmp(result,"YES")))
prefs.wtf=1;
else
prefs.wtf=0;
}
if(result=FindToolType(dobj->do_ToolTypes,"ADJUST")) {
if(!(strcmp(result,"YES")))
prefs.autoadjust=1;
else
prefs.autoadjust=0;
}
if(result=FindToolType(dobj->do_ToolTypes,"PUBSCREEN"))
strcpy(prefs.pub,result);
if(result=FindToolType(dobj->do_ToolTypes,"ACCENT"))
strcpy(prefs.accent,result);
if(result=FindToolType(dobj->do_ToolTypes,"TALKKEY"))
strcpy(prefs.tkey,result);
if(result=FindToolType(dobj->do_ToolTypes,"HOTKEY"))
strcpy(prefs.hkey,result);
if(result=FindToolType(dobj->do_ToolTypes,"BACKDROP"))
strcpy(prefs.backdrop,result);
FreeDiskObject(dobj);
CloseLibrary(IconBase);
}